<?php
namespace app\repository;

use app\model\Page;
use app\repository\BaseRepository;
use app\entity\User;
use app\Utils;
use app\service\ClazzService;

/**
 * 用户类
 * */
class UserRepository extends BaseRepository {
    private static $sessionKey = 'user';

    private $table = 'user';

    /**
     * 
     * 删除用户
     * @param $id id
     * @return 成功 true; 失败，失败的原因
     * 
     * */
    static function deleteById($id) {
        try {
            $conn = self::getConn();
            $sql = "delete from `user` where `id` = $id";
            $conn->exec($sql);
        }
        catch(PDOException $e)
        {
            return $e->getMessage();
        }
         
        $conn = null;  
        return true;
    }

    /**
     * 
     * 查询所有的用户数据
     * 
     * */
    static function findAll() {
        $conn = self::getConn();
        // 去判断当前用户名，密码是否与数据库当中存的一致
        $stmt = $conn->prepare("SELECT * FROM user"); 
        $stmt->execute();

        // 获取到查询到的所有记录
        $rows = $stmt->fetchAll();
        $conn = null;

        return $rows;
    }

    static function findAllUsers() {
        $rows = self::findAll();
        $users = [];
        foreach($rows as $row) {
            $user = new User($row);
            array_push($users, $user);
        }
        return $users;
    } 


    static function getById($id) {
        $conn = self::getConn();
        $stmt = $conn->prepare("SELECT * FROM user where id = $id"); 
        $stmt->execute();

        // 获取到查询到的所有记录
        $rows = $stmt->fetchAll();
        $conn = null;
        
        if (count($rows) > 0) {
            return $rows[0];
        } else {
            return [];
        }
    }

    function getEntity() {
        return new User();
    }

    /**
     * 
     * 获取当前登录的用户
     * 
     * */
    static function getCurrentLoginUser() {
        return ClazzService::getCurrentLoginUser();;
    }

    function getManyToOne() {
        return null;
    }

    /**
     * 
     * 获取查询中的where字符串
     * @param $username 用户名
     * @param $name 姓名
     * 
     * */
    static function getWhereString($username, $name) {
        $result = '';
        $wheres = [];

        if (isset($username) && !empty($username)) {
            $wheres['username'] = $username;
        }

        if (isset($name) && !empty($name)) {
            $wheres['name'] = $name;
        }
       
        $i = 0;
        foreach($wheres as $key => $value) {
            if ($i !== 0) {
                $result .= 'and';
            } else {
                $result .= 'where';
            }
            $result .= "`$key` like '%$value%' ";
            $i++;
        }

        return $result;
    }

    function getTable() {
        return $this->table;
    }

    /**
     * 用户登录
     * @param username 用户名
     * @param password 密码
     * @return 成功，返回登录用户；失败，返回null
     * */
    static function login($username, $password) {
        $conn = self::getConn();
        // 去判断当前用户名，密码是否与数据库当中存的一致
        $stmt = $conn->prepare("SELECT * FROM user where `username` = '$username'"); 
        $stmt->execute();

        // 获取到查询到的所有记录
        $rows = $stmt->fetchAll();
        $conn = null;

        if (count($rows) > 0) {
            // 找到了用户名对应的相关记录
            $user = $rows[0];
            if ($user['password'] === $password) {
                // 密码也相等，登录成功
                // 记录一些信息。
                // 当前用户是登录用户
                $_SESSION[self::$sessionKey] = $user;
                return $user;
            }
            
        }

        return null;
    }

    /**
     * 
     * 注销
     * 
     * */
    static function logout() {
        $_SESSION[self::$sessionKey] = null;
    }

    /**
     * 
     * 判断用户是否已经登录
     * 
     * */
    static function isLogin() {
        return ClazzService::isLogin();
    }

    /**
     * 
     * 分页 
     * @param $username 用户名 
     * @param $name 姓名
     * @param $page 第几页（0基)
     * @param $size 每页大小 
     * 
     * */
    static function page($username, $name, $number, $size = 3) {
        $conn = self::getConn();
        // 去判断当前用户名，密码是否与数据库当中存的一致
        $begin = $number * $size;

        // 接拼查询条件
        $where = self::getWhereString($username, $name);
        $query = "SELECT * FROM `user` $where order by `id` desc limit $begin, $size ";
        
        $stmt = $conn->prepare($query); 
        $stmt->execute();

        // 获取到查询到的所有记录
        $users = $stmt->fetchAll();

        // 查询一共有多少条
        $query = "select COUNT(*) FROM `user` $where";
        $stmt = $conn->prepare($query); 
        $stmt->execute();
        $rows = $stmt->fetch();
        $totalCount = (int) $rows[0];

        // 查询完毕，关闭数据库连接
        $conn = null;
      
        return new Page(
            $users,
            $number,
            $size,
            $totalCount
        );
    }

    static function save($name, $username, $role) {
        try {
            $conn = self::getConn();
            $sql = "INSERT INTO `user` (`name`, `username`, `role`, `password`)
            VALUES ('$name', '$username', '$role', 'yunzhi.club')";
            // 使用 exec() ，没有结果返回 
            $conn->exec($sql);
        }
        catch(PDOException $e)
        {
            return $e->getMessage();
        }
         
        $conn = null;  
        return true;
    }

    /**
     * 
     * 更新某个用户
     * @param $id id
     * @param $name 姓名
     * @param $username 用户名
     * @param $role 角色
     * @return 成功， true; 失败，数据库报错信息
     * **/
    static function updateById($id, $name, $username, $role) {
        try {
            $conn = self::getConn();
            $sql = "UPDATE `user` SET `name`='$name', `username`='$username', `role`='$role'
            WHERE `id` = $id";
            // 使用 exec() ，没有结果返回 
            $conn->exec($sql);
        }
        catch(\PDOException $e)
        {
            return $e->getMessage();
        }
         
        $conn = null;  
        return true;
    }
}